/**
 * 项目名称:
 *
 * @Author: 夏国倩
 * @Date: 2023/10/16 14:43
 * @Copyright
 */
package JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Hashtable;
import java.util.Map;
import java.util.Scanner;

/*
实现功能：
   1.需求：
       模拟用户登录功能的实现
   2.业务描述：
        程序运行的时候，提供一个输入的入口，可以让用户输入用户名和密码
        用户输入用户名和密码之后，提交信息，Java程序收集到用户信息
        Java程序连接数据库验证用户名和密码是否合法
        合法：显示登录成功
        不合法：显示登录失败
    3.数据的准备
         drop table if exists t_user;
         create table t_user(
         id int auto_increment,
         loginName varchar(255),
         loginPwd varchar(255),
         realName varchar(255),
         primary key(id)
         );
         insert into t_user(loginName,loginPwd,realName) values('zhangsan','123','张三')
         insert into t_user(loginName,loginPwd,realName) values('jack','123','杰克')
         commit;
         select * from t_user;
    4.当前程序存在的问题:
         用户名：fafa
         密码：fafa' or '1=1
         select * from t_user where loginName='fafa' and loginPwd ='fafa' or '1=1'
         登录成功
         这种现象被称为SQL注入（安全隐患）、（黑客经常使用）
    5.导致SQL注入的根本原因是什么？
          用户输入的信息中含有SQL语句的关键字，并且这些关键字参与SQL语句的编译过程
          导致SQL语句的意愿被扭曲，进而达到SQL注入
 */
public class JDBCtest6 {
    public static void main(String[] args) {
        //初始化一个界面，用于接收用户输入的用户信息
        Map<String, String> userLoginInfo = initUI();
        //验证用户名和密码
        boolean loginSuccess = login(userLoginInfo);
        //最后输出结果
        System.out.println(loginSuccess?"登录成功":"登录失败");
    }

    /**
     * 用户登录
     * @param userLoginInfo 用户登录信息
     * @return  false 表示失败，true表示成功
     */
    private static boolean login(Map<String, String> userLoginInfo) {
        //打标记的意识
        boolean loginSuccess=false;
        //单独定义变量
        String loginName=userLoginInfo.get("loginName");
        String loginPwd=userLoginInfo.get("loginPwd");

        //JDBC代码
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;

        try{
            //1. 注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/base6?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC",
                    "root",
                    "123456");
            //3.获取数据库操作对象
            stmt=conn.createStatement();
            //4.执行SQL
            String sql="select * from t_user where loginName ='"+loginName+"' and loginPwd = '"+loginPwd+"'";
            rs=stmt.executeQuery(sql);
            //5.处理结果集
            if (rs.next()) {
                //登录成功
                loginSuccess = true;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //6.释放资源
            if (rs != null){
                try{
                    rs.close();
                }catch (Exception e){
                    throw new RuntimeException(e);
                }
            }
            if (stmt != null){
                try{
                    stmt.close();
                }catch (Exception e){
                    throw new RuntimeException(e);
                }
            }
            if (conn != null){
                try{
                    conn.close();
                }catch (Exception e){
                    throw new RuntimeException(e);
                }
            }

        }
        //查询
        return loginSuccess;
    }

    /**
     * 初始化用户界面
     *
     * @return 用户输入的用户名和密码信息
     */
    private static Map<String, String> initUI() {
        Scanner s = new Scanner(System.in);

        System.out.println("用户名：");
        String loginName = s.nextLine();

        System.out.println("密码：");
        String loginPwd = s.nextLine();

        Map<String, String> userLoginInfo = new Hashtable<>();
        userLoginInfo.put("loginName", loginName);
        userLoginInfo.put("loginPwd", loginPwd);


        return userLoginInfo;
    }
}
